//package com.lagou.java.factory;
//
//import org.dom4j.Document;
//import org.dom4j.DocumentException;
//import org.dom4j.Element;
//import org.dom4j.io.SAXReader;
//
//import java.io.InputStream;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//public class BeanFactory {
//
//    /**
//     * 任务一: 读取解析xml, 通过反射技术实例化对象并且存储待用(map集合)
//     * 任务二: 对外提供获取实例对象的接口(根据ID获取)
//     */
//    private static Map<String, Object> map = new HashMap<>(); //存储对象
//
//    static {
//        //任务一: 读取解析xml, 通过反射技术实例化对象并且存储待用(map集合)
//        InputStream resourceAsStream = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
//        try {
//            Document doc = new SAXReader().read(resourceAsStream);
//            Element rootElement = doc.getRootElement();
//            List<Element> list = rootElement.selectNodes("//bean");
//            for (Element element : list) {
//                String id = element.attributeValue("id");
//                String className = element.attributeValue("class");
//                map.put(id, Class.forName(className).newInstance());
//            }
//
//            //实例化完成之后, 检查哪些值需要传入, 根据配置传入相应的值
//            List<Element> selectNodes = rootElement.selectNodes("//property");
//            for (Element selectNode : selectNodes) {
//                String parentId = selectNode.getParent().attributeValue("id");
//                String name = selectNode.attributeValue("name");
//                String ref = selectNode.attributeValue("ref");
//
//                Object parent = map.get(parentId);
//                //遍历父对象中的所有方法, 找到set + name
//                for (Method method : parent.getClass().getMethods()) {
//                    if(method.getName().equalsIgnoreCase("set" + name)) {
//                        method.invoke(parent, map.get(ref));
//                    }
//                }
//                //把处理之后的parentObject重新放入map中
//                map.put(parentId, parent);
//            }
//
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//        } catch (InvocationTargetException e) {
//            e.printStackTrace();
//        }
//    }
//
//    public static Object getBean (String id) {
//        return map.get(id);
//    }
//
//
//
//
//
//
//
//}
